package models

import (
	"errors"
	"fmt"
	"gorm.io/gorm"
	"time"
)

// Team 表示一个团队，与数据库表teams绑定
type Team struct {
	ID            uint64    `gorm:"primaryKey;autoIncrement;column:id" json:"id" form:"id"`
	Name          string    `gorm:"type:varchar(255);not null;column:name" json:"name" form:"name"`
	CaptainUserID uint64    `gorm:"type:bigint;not null;column:captain_user_id" json:"captain_user_id" form:"captain_user_id"`
	Status        bool      `gorm:"type:tinyint(1);not null;default:1;column:status" json:"status" form:"status"` //0表示冻结  1表示激活
	Address       string    `gorm:"type:text;column:address" json:"address" form:"address"`
	CreatedAt     time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP;column:created_at" json:"created_at" form:"created_at"`
	UpdatedAt     time.Time `gorm:"type:timestamp;default:CURRENT_TIMESTAMP;update:CURRENT_TIMESTAMP;column:updated_at" json:"updated_at" form:"updated_at"`
}

// TableName 返回表名
func (Team) TableName() string {
	return "teams"
}

//	GetTeamByID
//
// 描述信息： 根据teamID查询团队信息
//
// Param：
//
//	db ：数据库连接实例
//	teamID ：团队id
//
// Return：
//
//	Team ：当前 id 对应的 team 对象
//	error ：错误信息
func (t Team) GetTeamByID(db *gorm.DB, teamID uint64) (Team, error) {
	var team Team
	result := db.First(&team, "id = ?", teamID)
	if errors.Is(result.Error, gorm.ErrRecordNotFound) {
		return Team{}, nil // 返回空的Team对象
	}
	if result.Error != nil {
		return Team{}, result.Error
	}
	return team, nil
}

//	GetTeamsByIDs
//
// 描述信息： 根据teamID列表查询团队信息
//
// Param：
//
//	db ：数据库连接实例
//	teamIDs ：团队 id 切片
//
// Return：
//
//	[]Team ：切片对应的 团队 对象列表
//	error ：错误信息
func (t Team) GetTeamsByIDs(db *gorm.DB, teamIDs []uint64) ([]Team, error) {
	var teams []Team
	result := db.Where("id IN ?", teamIDs).Find(&teams)
	if result.Error != nil {
		return nil, result.Error
	}
	return teams, nil
}

// TeamDetail （团队信息，团队成员信息）
type TeamDetail struct {
	Team    Team
	Members []UserAndProPermissionsDetail
}

// GetAllTeams 查询所有团队
func (t Team) GetAllTeams(db *gorm.DB) ([]Team, error) {
	var teams []Team
	result := db.Find(&teams)
	if result.Error != nil {
		// 如果查询过程中出现错误，返回错误
		return nil, result.Error
	}
	return teams, nil
}

// DeleteTeamByID 根据 id 删除指定的 Team 数据
func (t Team) DeleteTeamByID(db *gorm.DB, id uint64) error {
	// 删除指定 id 的记录
	result := db.Where("id = ?", id).Delete(&Team{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete team with id %d: %w", id, result.Error)
	}
	return nil
}
